package com.malou.client.ventas.movimiento.entrada;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.data.BaseListLoader;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.data.BeanModelReader;
import com.extjs.gxt.ui.client.data.ListLoadResult;
import com.extjs.gxt.ui.client.data.ListLoader;
import com.extjs.gxt.ui.client.data.LoadEvent;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.data.RpcProxy;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.LoadListener;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.Label;
import com.extjs.gxt.ui.client.widget.Status;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.DateField;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.grid.CellEditor;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.EditorGrid;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.malou.client.MalouConstants;
import com.malou.client.reportes.PdfReportViewer;
import com.malou.client.ventas.movimiento.salida.MovimientoSalida;

public class MovimientoRecepcionarDialog extends Dialog {

	private Button guardar;
	private Button cancelar;
	public Status status;
	private MalouConstants constants = GWT.create(MalouConstants.class);
	private MovimientoEntradaServiceAsync mves = GWT.create(MovimientoEntradaService.class);
	private ListStore<BeanModel> storeMovimiento;
	private ListLoader<ListLoadResult<ModelData>> loaderMovimiento;
	private ToolBar toolBar;
	private ComboBox<BeanModel> numeroVales;
	private DateField fecha;
	private TextField<String> procedencia;
	private String numeroVale;
	private EditorGrid<BeanModel> grid;
	private Boolean control=false; 
	
	
	public MovimientoRecepcionarDialog(){
		setLayout(new FitLayout());
		setModal(true);
		setPlain(true);
		setSize(850, 558);
		setClosable(true);
		
		setButtonAlign(HorizontalAlignment.LEFT);
	    setButtons("");
	    
	    setBodyBorder(true);	    
	    setResizable(false);
	    
	    setIconStyle("icon-stock");
		setHeading(constants.movimientoNuevaEntrada());		
		
		RpcProxy<List<MovimientoEntrada>> proxy = new RpcProxy<List<MovimientoEntrada>>(){

			@Override
			protected void load(Object loadConfig,
					AsyncCallback<List<MovimientoEntrada>> callback) {
				mves.getEntradasPendientes(numeroVale, callback);
			}
			
		};
		
		loaderMovimiento = new BaseListLoader<ListLoadResult<ModelData>>(proxy, new BeanModelReader());
		
		storeMovimiento = new ListStore<BeanModel>(loaderMovimiento);
		
		loaderMovimiento.addLoadListener(new LoadListener(){
			public void loaderLoad(LoadEvent le) {
				//sm.selectAll();				
				guardar.setEnabled(true);
			}
		});
		
	    ArrayList<ColumnConfig> columns = new ArrayList<ColumnConfig>();
	    
	  
	    
		
	    ColumnConfig column = new ColumnConfig();
	    
	    columns.add(new ColumnConfig("codigo", constants.movimientoCodigo(), 120));
	    
		columns.add(new ColumnConfig("modeloprenda", constants.movimientoPrenda(), 500));
		        
        column = new ColumnConfig("cantidad", constants.movimientoCantidad(), 80);
        column.setAlignment(HorizontalAlignment.RIGHT);
        
        NumberField cantidad = new NumberField();
        cantidad.setAllowBlank(false);
        cantidad.setPropertyEditorType(Integer.class);
        cantidad.setAllowNegative(false);
        cantidad.setAllowDecimals(false);
        
        column.setEditor(new CellEditor(cantidad));
        columns.add(column);
     
        
        ColumnModel cm = new ColumnModel(columns);       
        
        grid = new EditorGrid<BeanModel>(storeMovimiento, cm);
        grid.setLoadMask(true);  
        grid.setBorders(true);

        add(grid);
        

        
        toolBar = new ToolBar();
        toolBar.add(new Label(constants.movimientoNumeroVale()+" : "));
        RpcProxy<List<MovimientoSalida>> sproxy = new RpcProxy<List<MovimientoSalida>>(){

			@Override
			protected void load(Object loadConfig,
					AsyncCallback<List<MovimientoSalida>> callback) {
				mves.getNumeroVales(callback);
			}
			
		};
		
		BaseListLoader<ListLoadResult<ModelData>> loaderVales = new BaseListLoader<ListLoadResult<ModelData>>(sproxy, new BeanModelReader());
		
		ListStore<BeanModel> storeVales = new ListStore<BeanModel>(loaderVales);
		
		numeroVales = new ComboBox<BeanModel>();  
		numeroVales.setEditable(false);
		numeroVales.setFieldLabel(constants.movimientoNumeroVale());
		numeroVales.setDisplayField("numero");
		numeroVales.setEmptyText("Seleccione...");	      
		numeroVales.setStore(storeVales);  
		numeroVales.setTypeAhead(true);  
		numeroVales.setTriggerAction(TriggerAction.ALL);
		numeroVales.setValueField("nombre");
		numeroVales.setUseQueryCache(false);
		numeroVales.setAllowBlank(false);
		
		toolBar.add(numeroVales);
		
		numeroVales.addSelectionChangedListener(new SelectionChangedListener<BeanModel>() {
			
			@Override
			public void selectionChanged(SelectionChangedEvent<BeanModel> se) {
				BeanModel be = se.getSelectedItem();
				if(be != null){
					Date fe = (Date)be.get("fecha");
					String tda = (String)be.get("tienda");
					fecha.setValue(fe);
					procedencia.setValue(tda);
					numeroVale = (String)be.get("numero");
					MovimientoEntradas.numero=numeroVale;
					loaderMovimiento.load();					
				}else{
					guardar.setEnabled(false);
				}
				
				if(control){
					removeAll();
					add(grid);
					layout();
					guardar.setVisible(true);
					control=false;
					
				}
			}
		});
		
		Label lfecha = new Label(constants.movimientoFechaVale()+" : ");
		lfecha.setStyleAttribute("marginLeft", "25px");
		toolBar.add(lfecha);
		
		fecha = new DateField();
		fecha.getPropertyEditor().setFormat(DateTimeFormat.getFormat("yyy-MM-dd"));
		fecha.setReadOnly(true);		
		toolBar.add(fecha);
		
		Label lprocedencia = new Label(constants.movimientoProcedencia()+" : ");
		lprocedencia.setStyleAttribute("marginLeft", "25px");
		toolBar.add(lprocedencia);
		
		procedencia = new TextField<String>();
		procedencia.setReadOnly(true);
		toolBar.add(procedencia);
		
        setTopComponent(toolBar);
	}
	
	@Override
	  protected void createButtons() {
	    super.createButtons();
	    
	    if (constants == null) {
	    	constants = GWT.create(MalouConstants.class);
		}
	    
	    status = new Status();
	    status.setBusy(constants.guardando());
	    status.hide();
	    status.setAutoWidth(true);
	    getButtonBar().add(status);
	    
	    getButtonBar().add(new FillToolItem());
	    
	    cancelar = new Button(constants.cancelar(),
				IconHelper.createPath("images/icons/cancel.png"));
		cancelar.setSize(70, 25);
	    
	    cancelar.addSelectionListener(new SelectionListener<ButtonEvent>() {
		      public void componentSelected(ButtonEvent ce) {	    	  
		    	 MovimientoRecepcionarDialog.this.hide();
		      }

		});
	    
	    guardar = new Button(constants.guardar(),
				IconHelper.createPath("images/icons/save_all.png"));
		guardar.setSize(70, 25);
	    
	    guardar.setEnabled(false);
	    guardar.addSelectionListener(new SelectionListener<ButtonEvent>() {
		      public void componentSelected(ButtonEvent ce) {
		    	  
		    		  status.show();
		    		  getButtonBar().disable();
		    		  storeMovimiento.commitChanges();
		    		  List<MovimientoEntrada> list = new ArrayList<MovimientoEntrada>(); 
		    		  MovimientoEntrada me;
		    		  Integer tiendaorigen_id = (Integer)numeroVales.getValue().get("tienda_id");
		    		  
		    		  for(BeanModel b:storeMovimiento.getModels()){
			    		 me = new MovimientoEntrada();
			    		 me.setModeloprenda_id(Integer.valueOf(b.get("modeloprenda_id").toString()));		    			  
			    		 me.setTiendaorigen_id(tiendaorigen_id);
			    		 me.setCantidad(Integer.valueOf(b.get("cantidad").toString()));
			    		 me.setMovimientosalida_id(Integer.valueOf(b.get("movimientosalida_id").toString()));
			    		 me.setFecha(new Date());
			    		 list.add(me);	    			  
		    		  }	    		  
		    		 
		    		  
		    		  MovimientoEntradas.movimientoRecepcionDialog = MovimientoRecepcionarDialog.this;
		    		  MovimientoEntradas.save(list);
		    	      	  
		      }
		    });
		    
		    addButton(guardar);
		    addButton(cancelar);
	 }
	
	public void clear(){
		numeroVales.clear();
		fecha.clear();
		procedencia.clear();
		storeMovimiento.removeAll();
		guardar.setEnabled(false);
	}
	
	
	public void loadReporte(String numero){
		
		if(!control){
		removeAll();
		HashMap<String, Object> param = new HashMap<String, Object>();
		param.put("numero", numero);
		PdfReportViewer reportViewer = new PdfReportViewer("reports/reporte_verificacion", param, status,null, null, null);
		add(reportViewer);
		layout();
		control=true;
		guardar.setVisible(false);
		}
	}
}
